import {
	toast
} from './hint.js'
/**
 * 获取节点高度
 * @param {string} nodes dome节点类名
 * @param {object} _this this
 */
export const getNode = (nodes, _this, callback) => {
	return new Promise((resolve, reject) => {
		_this.$nextTick(() => {
			let time = setTimeout(() => {
				let node = uni.createSelectorQuery().in(_this)
				node.select(nodes).boundingClientRect();
				node.exec((res) => {
					if (!res) {
						getNode(nodes, _this)
					} else {
						resolve(res[0])
						typeof callback === 'function' && callback(res[0])
					}
				})
				clearTimeout(time)
			}, 200)
		})
	})
}
/**
 * @param {string} value 值
 * @param {string} unit 单位
 */
export function rpxunit(value, unit = 'rpx') {
	if (!value) return ''
	// 定义正则表达式模式
	const pattern = /(\d+)([a-zA-Z%]+)/
	// 对字符串进行匹配并提取结果
	const matches = value.match(pattern)
	if (matches && matches.length > 0) {
		const group1 = matches[1] // 第一个分组（包含数字）
		const group2 = matches[2] // 第二个分组（包含字母）
		return group1 + group2
	} else {
		return value + unit
	}

}
/**
 * 拨打电话
 * @param {Object} phone = '电话号码'
 */
export function callPhone(phone) {
	var isPhone = /^([0-9]{3,4}-)?[0-9]{7,8}$/;
	var isMob =
		/^((\+?86)|(\(\+86\)))?(13[012356789][0-9]{8}|15[012356789][0-9]{8}|18[02356789][0-9]{8}|147[0-9]{8}|1349[0-9]{7})$/;
	if (isMob.test(phone) || isPhone.test(phone)) {
		uni.makePhoneCall({
			phoneNumber: phone
		});
		return true;
	} else {
		uni.showToast({
			title: '号码有误',
			icon: 'none',
			duration: 1300
		})
		return false
	}
}
let observer = null;
/**
 * 监听区域触底执行函数
 * @param {Object} parentNode ='区域节点类名'
 * @param {Object} node ='出现时执行的节点类名'
 * @param {Object} _this ='vue this'
 * @param {Object} callback = '回调函数'
 */
export function observe(parentNode, node, _this, callback) {
	observer = uni.createIntersectionObserver(_this);
	_this.$nextTick(() => {
		let fun = parentNode ? observer.relativeTo(parentNode) : observer.relativeToViewport()
		fun.observe(node, (res) => {
			callback(res)
			observer.disconnect()
		})
	})
}
/**
 * 取消触底执行函数的监听
 */
export function offObserve() {
	observer.disconnect()
}



/**
 * 防抖原理：在事件不断触发的情况下 只有在限定的时间内执行一次 后续不再执行，或者在限定的时间内不执行，在事件结束的时候执行一次
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
export function debounce(func, wait = 500, immediate = true) {
	let timeout = null
	return function() {
		if (timeout !== null) clearTimeout(timeout)
		// 建议按钮使用立即执行，输入框使用延时执行
		if (immediate) {
			timeout = setTimeout(() => {
				timeout = null
			}, wait)
			if (!timeout) typeof func === 'function' && func()
		} else {
			timeout = setTimeout(() => {
				typeof func === 'function' && func()
			}, wait)
		}
	}
}

/**
 * 节流原理：在事件不断触发的情况下，每个隔一个时间段事件执行一次，形成有频率的执行
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
export function throttle(fun, wait = 1000, immediate=false) {
	if (immediate) {
		let sign = 0
		return function() {
			let date = new Date().getTime()
			if (date - sign >= wait) {
				typeof fun === 'function' && fun()
				sign = date
			}
		}
	} else {
		let time;
		return function() {
			if (time) {
				return
			}
			time = setTimeout(() => {
				typeof fun === 'function' && fun()
				time = null
			}, wait)
		}
	}
}
/**
 * 复制文字
 *
 * @param {string} data 要复制的文字
 * @param {string} icon 提示icon
 * @param {string} title 提示文字
 * @return null
 */
export function copy(data, title = '复制成功', icon = 'none') {
	data = data.toString()
	uni.setClipboardData({
		data,
		success: function() {
			uni.showToast({
				title,
				icon
			})
		}
	});
}
/**
 * 是否登录
 * @param {Function} callback 登录后的回调函数
 * @return boolean
 */
export function isLogin(callback, ...gms) {
	let token
	token = uni.getStorageSync('token') || uni.getStorageSync('lifeData').token
	if (token) {
		typeof callback === 'function' && callback.call(this, ...gms)
		return true
	} else {
		toast('登录失效，请重新登录', false, () => {
			uni.navigateTo({
				url: '/pages-login/index'
			})
		})
		return false
	}
}
/**
 * 对象深度合并
 * @param {object}  obj 对象
 * @param {object}  target 对象
 */
export function deepMerge(obj, target = {}) {
	// target 替换 obj
	let p = {}; // 是为了调用 Object.prototype.toSring方便
	for (let key in target) {
		let isA = p.toString.call(obj[key]) === '[object Object]',
			isB = p.toString.call(target[key]) === '[object Object]';
		if (isA && isB) {
			obj[key] = deepMerge(obj[key], target[key])
		} else if (Array.isArray(obj[key]) && Array.isArray(target[key])) {
			// Array.from 方法可以把一个类数组对象转为数组
			obj[key] = Array.from(new Set(obj[key].concat(target[key])))
		} else {
			obj[key] = target[key];
		}
	}
	return obj;
}
export function inDev() {
	uni.showToast({
		title: '功能开发中...',
		icon: 'none'
	})
}
/**
 * 在开发环境才显示
 */
export function devShow() {
	return process.env.NODE_ENV === 'development'
}